package horncomb.bpm.task;

import horncomb.bpm.process.core.Token;
import horncomb.bpm.task.core.TaskComment;
import horncomb.bpm.task.core.TaskDefinition;
import horncomb.bpm.task.core.TaskInstance;
import horncomb.bpm.task.core.TaskInstanceCreator;

import java.util.List;

/**
 * @author Daniel
 */
public interface TaskManager {
	/**
	 * 获取指定人员的待办列表
	 * @param actor
	 */
	public List<? extends TaskInstance> findActorTodoTaskInstances(String actor);

	/**
	 * 直接完成任务，不执行流程。
	 * @param taskInstanceId
	 * @param contextModel
	 */
	public void finish(String taskInstanceId, Object contextModel);

	/**
	 * 完成某个任务，并执行流程。
	 * @param taskInstanceId
	 * @param contextModel
	 */
	public void finish(String taskInstanceId, String transitionId,
			Object contextModel);

	/**
	 * 根据ID获取任务实例
	 * @param taskInstanceId
	 * @return
	 */
	public TaskInstance findTaskInstance(String taskInstanceId);

	/**
	 * 调用创建任务实例.
	 * <P>
	 * 如果任务创建器不存在，则使用默认的任务创建器。同时缓存或持久化任务实例。
	 * @param token
	 * @param taskDefinition
	 * @param contextModel
	 * @param taskInstanceCreator
	 * @return
	 */
	public TaskInstance createTaskInstance(Token token,
			TaskDefinition taskDefinition, Object contextModel,
			TaskInstanceCreator creator);

	/**
	 * 转交任务
	 * @param sourceId
	 * @param actor
	 * @return
	 */
	public TaskInstance transfer(String sourceId, String actor);

	/**
	 * 添加任务办理意见
	 * @param taskInstanceId
	 * @param comment
	 */
	public void addComment(String taskInstanceId, String comment);

	/**
	 * 查找任务注释，按时间倒序排列
	 * @param taskInstanceId
	 * @return
	 */
	public List<? extends TaskComment> findTaskComments(String taskInstanceId);

	/**
	 * 查找token下的任务注释，按时间倒序排列
	 * @param tokenId
	 * @return
	 */
	public List<? extends TaskComment> findTaskCommentsInToken(String tokenId);

	/**
	 * 查找一个Token的待办的任务
	 * @param tokenId
	 * @return
	 */
	public List<? extends TaskInstance> findTodoTaskInstancesInToken(
			String tokenId);

	/**
	 * 查找一个Token待办的任务的办理人
	 * @param tokenId
	 * @return
	 */
	public List<String> findTodoTaskActorsInToken(String tokenId);

	public void update(TaskInstance taskInstance);

	/**
	 * @param tokenId
	 */
	public List<? extends TaskInstance> findTaskInstancesByTokenId(
			String tokenId);

	/**
	 * @param id
	 */
	public void deleteTaskInstance(String id);
}